home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / os2 / pvm34b3.zip / pvm34b3 / pvm3 / xep / TrueColorFix < prev    next >
Internet Message Format  |  1997-07-22  |  11KB

  1. Received: from msr.epm.ornl.gov by CS.UTK.EDU with SMTP (cf v2.9s-UTK)
  2.     id EAA23496; Mon, 11 Jul 1994 04:48:33 -0400
  3. Received: from appana.ap.titech.ac.jp by msr.epm.ornl.gov (4.1/1.34)
  4.     id AA28611; Mon, 11 Jul 94 04:46:41 EDT
  5. Received: by appana.ap.titech.ac.jp (5.65+1.6W/tit-mx1.1); Mon, 11 Jul 94 17:45:55 +0900
  6. Received: by wisdom.ap.titech.ac.jp (NX5.67c/NX3.0S)
  7.     id AA12748; Mon, 11 Jul 94 17:46:04 +0900
  8. Date: Mon, 11 Jul 94 17:46:04 +0900
  9. From: Satoshi Adachi <adachi@wisdom.ap.titech.ac.jp>
  10. Message-Id: <9407110846.AA12748@wisdom.ap.titech.ac.jp>
  11. To: pvm@msr.epm.ornl.gov
  12. Subject: Modifications of xep necessary for NeXTstation Color.
  13. Cc: adachi@wisdom.ap.titech.ac.jp
  14.  
  15.  
  16. Dear Scientists and Engineers who have been developing PVM:
  17.  
  18. (1) Recently, I was informed by my friend that there is a very nice
  19. software system, called PVM, that enable us to look a cluster of
  20. many workstations as a single virtual machine and to write
  21. parallel programs for the virtual machine. So, I installed
  22. PVM3.2.4 for our workstation cluster of NeXTstation's and IBM RS6000's.
  23. Now, PVM works very well on our workstation cluster.
  24. I have just begun writing several programs for physics by using PVM.
  25. Thank you very much for developing such a nice software system
  26. and for making it a free software.
  27.  
  28. In the installation of PVM3.2.4, the body part of PVM did not need
  29. any change of source code and the installcation was completely automatic.
  30. However, the installtion of the demo program "xep" for NeXTstation color
  31. needed some change of source code.
  32.  
  33. In this email, I will explain the modification of the source code of "xep"
  34. which is necessary to run "xep" on NeXTstation Color and NeXTstation Color
  35. Turbo.
  36.  
  37. I hope that the modification or its equivalent will be incorpolated in
  38. the future releases of "xep".
  39.  
  40. (2) Our NeXTstaion Color's and NeXTstation Color Turbo's are running
  41. under NeXTSTEP 3.0J and the commercial X Window software "Co-Xist"
  42. is installed on these machines.
  43.  
  44. For NeXTstaion Color and NeXTstation Color Turbo, the true color model is
  45. used rather than the pseudo color model. On the screen, each pixel directly
  46. corresponds to a binary number of 12 bit length. Namely, Red, Green and
  47. Blue intensities are expressed by 4 bit integers. In C programs, a pixel
  48. is prepresented by a short integer with 16 bit which consists of 12 bit
  49. RGB fields and 4 bit pad.
  50.  
  51. The source code of "xep" supports the not only the pseudo colode model
  52. but also the true color model. However, when the true color model is used,
  53. it is assumed that each pixel is expressed by the RGB value of 24 bit
  54. length (8 bit each) and is represented by 32 bit integer in C programs
  55. (including 8 bit pad).
  56.  
  57. This assumption supposed by "xep" does not hold for NeXTstation Color and
  58. NeXTstation Color Turbo. Consequently, "xep" abends on these machines with
  59. Co-Xist.
  60.  
  61. In order to support the true color model with RGB value represented by
  62. not only 3*8 bit but also 3*4 bit, I changed the source code of "xep"
  63. in the file "xep/xep.c" in the following way:
  64.  
  65. -------------------------------------------------------------------------------
  66. *** xep.c    Mon Jul 11 17:19:01 1994
  67. --- xep.c.org    Sat Jul  9 20:16:37 1994
  68. ***************
  69. *** 70,78 ****
  70.   
  71.   typedef    unsigned int IBIT32;
  72.   
  73. - /* ***** Added by S.Adachi (94/07/09) ***** */
  74. - typedef unsigned short int IBIT16;
  75.   /* describes an image canvas (currently only one) */
  76.   
  77.   struct canvas {
  78. --- 70,75 ----
  79. ***************
  80. *** 410,437 ****
  81.               }
  82.               xBpp = pfv[i].bits_per_pixel;
  83.               xBypp = xBpp / 8;
  84. -             /* ***** Modified by S.Adachi (94/07/10) ***** */
  85. - #if 0
  86.               redMask = defVis->red_mask;
  87.               redShift = ffs(redMask & ~(redMask >> 1)) - 8;
  88.               greenMask = defVis->green_mask;
  89.               greenShift = ffs(greenMask & ~(greenMask >> 1)) - 8;
  90.               blueMask = defVis->blue_mask;
  91.               blueShift = ffs(blueMask & ~(blueMask >> 1)) - 8;
  92. - #else
  93. -             if ((xBypp != 2) && (xBypp != 4)) {
  94. -               fprintf(stderr, "unsupported bytes per pixel: %d\n",
  95. -                   xBypp);
  96. -               exit(1);
  97. -             }
  98. -             redMask = defVis->red_mask;
  99. -             redShift = ffs(redMask) - 1;
  100. -             greenMask = defVis->green_mask;
  101. -             greenShift = ffs(greenMask) - 1;
  102. -             blueMask = defVis->blue_mask;
  103. -             blueShift = ffs(blueMask) - 1;
  104. - #endif /* Modification by S.Adachi (94/07/10) */
  105.               mkrbow(fclutr, fclutg, fclutb, 256);
  106.           } else {
  107.               isCmap = 1;
  108.               xCmap = DefaultColormap(xDisp, xScrn);
  109. --- 407,420 ----
  110.               }
  111.               xBpp = pfv[i].bits_per_pixel;
  112.               xBypp = xBpp / 8;
  113.               redMask = defVis->red_mask;
  114.               redShift = ffs(redMask & ~(redMask >> 1)) - 8;
  115.               greenMask = defVis->green_mask;
  116.               greenShift = ffs(greenMask & ~(greenMask >> 1)) - 8;
  117.               blueMask = defVis->blue_mask;
  118.               blueShift = ffs(blueMask & ~(blueMask >> 1)) - 8;
  119.               mkrbow(fclutr, fclutg, fclutb, 256);
  120.           } else {
  121.               isCmap = 1;
  122.               xCmap = DefaultColormap(xDisp, xScrn);
  123. ***************
  124. *** 1044,1068 ****
  125.       return x;
  126.   }
  127.   
  128. - /* ***** Added by S.Adachi (94/07/09) ***** */
  129. - /*    sw2()
  130. - *
  131. - *    Byteswap a 16-bit integer.
  132. - */
  133. - IBIT16
  134. - sw2(x)
  135. -     IBIT16 x;
  136. - {
  137. -     u_char *cp = (u_char*)&x;
  138. -     u_char c;
  139. -     c = cp[0];
  140. -     cp[0] = cp[1];
  141. -     cp[1] = c;
  142. -     return x;
  143. - }
  144.   
  145.   /*    repaint_region()
  146.   *
  147. --- 1027,1032 ----
  148. ***************
  149. *** 1133,1212 ****
  150.               dy = (y1 - cnp->cn_oy) * cnp->cn_zoom;
  151.               ya = 0;
  152.               while (sy < y2 && dy < cnp->cn_ht) {
  153. !               sx = x1;
  154. !               dx = (x1 - cnp->cn_ox) * cnp->cn_zoom;
  155. !               xa = 0;
  156. !               sa = ribuf + sy * cnp->cn_wd + sx;
  157. !               /* ***** Modified by S.Adachi (94/07/09) ***** */
  158. ! #if 0
  159. !               da = (ximbuf + dy * cnp->cn_xim->bytes_per_line
  160. !                 + dx * sizeof(IBIT32));
  161. !               while (sx < x2 && dx < cnp->cn_wd) {
  162. !                 pixv = lbm & *sa;
  163. !                 pixr = fclutr[pixv];
  164. !                 pixg = fclutg[pixv];
  165. !                 pixb = fclutb[pixv];
  166. !                 pixv = (redMask & (pixr << redShift))
  167. !                   | (greenMask & (pixg << greenShift))
  168. !                 | (blueMask & (pixb << blueShift));
  169. !                 if (revByte)
  170. !                   *((IBIT32*)da) = sw4(pixv);
  171. !                 else
  172. !                   *((IBIT32*)da) = pixv;
  173. !                 da += sizeof(IBIT32);
  174. !                 dx++;
  175. !                 if (++xa >= cnp->cn_zoom) {
  176. !                   xa = 0;
  177. !                   sx++;
  178. !                   sa++;
  179. !                 }
  180. !               }
  181. ! #else
  182. !               da = (ximbuf + dy * cnp->cn_xim->bytes_per_line
  183. !                 + dx * xBypp);
  184. !               while (sx < x2 && dx < cnp->cn_wd) {
  185. !                 pixv = lbm & *sa;
  186. !                 pixr = fclutr[pixv];
  187. !                 pixg = fclutg[pixv];
  188. !                 pixb = fclutb[pixv];
  189. !                 if (xBypp == 4) {
  190. !                   pixv = ((redMask & (pixr << redShift))
  191. !                       |(greenMask & (pixg << greenShift))
  192. !                       |(blueMask & (pixb << blueShift)));
  193. !                   if (revByte)
  194. !                 *((IBIT32*)da) = sw4(pixv);
  195. !                   else
  196. !                 *((IBIT32*)da) = pixv;
  197. !                   da += sizeof(IBIT32);
  198. !                 }
  199. !                 else {
  200. !                   /* xBypp == 2 */
  201. !                   IBIT16 pixvs;
  202. !                   pixr = pixr >> 4;
  203. !                   pixg = pixg >> 4;
  204. !                   pixb = pixb >> 4;
  205. !                   pixvs = ((redMask & (pixr << redShift))
  206. !                        |(greenMask & (pixg << greenShift))
  207. !                        |(blueMask & (pixb << blueShift)));
  208. !                   if (revByte)
  209. !                 *((IBIT16*)da) = sw2(pixvs);
  210. !                   else
  211. !                 *((IBIT16*)da) = pixvs;
  212. !                   da += sizeof(IBIT16);
  213. !                 }
  214. !                 dx++;
  215. !                 if (++xa >= cnp->cn_zoom) {
  216. !                   xa = 0;
  217. !                   sx++;
  218. !                   sa++;
  219. !                 }
  220. !               }
  221. ! #endif /* ***** End of Modification by S.Adachi (94/07/10) ***** */
  222. !               dy++;
  223. !               if (++ya >= cnp->cn_zoom) {
  224. !                 ya = 0;
  225. !                 sy++;
  226. !               }
  227.               }
  228.           }
  229.   
  230. --- 1097,1133 ----
  231.               dy = (y1 - cnp->cn_oy) * cnp->cn_zoom;
  232.               ya = 0;
  233.               while (sy < y2 && dy < cnp->cn_ht) {
  234. !                 sx = x1;
  235. !                 dx = (x1 - cnp->cn_ox) * cnp->cn_zoom;
  236. !                 xa = 0;
  237. !                 sa = ribuf + sy * cnp->cn_wd + sx;
  238. !                 da = ximbuf + dy * cnp->cn_xim->bytes_per_line + dx * sizeof(IBIT32);
  239. !                 while (sx < x2 && dx < cnp->cn_wd) {
  240. !                     pixv = lbm & *sa;
  241. !                     pixr = fclutr[pixv];
  242. !                     pixg = fclutg[pixv];
  243. !                     pixb = fclutb[pixv];
  244. !                     pixv = (redMask & (pixr << redShift))
  245. !                             | (greenMask & (pixg << greenShift))
  246. !                             | (blueMask & (pixb << blueShift));
  247. !                     if (revByte)
  248. !                         *((IBIT32*)da) = sw4(pixv);
  249. !                     else
  250. !                         *((IBIT32*)da) = pixv;
  251. !         
  252. !                     da += sizeof(IBIT32);
  253. !                     dx++;
  254. !                     if (++xa >= cnp->cn_zoom) {
  255. !                         xa = 0;
  256. !                         sx++;
  257. !                         sa++;
  258. !                     }
  259. !                 }
  260. !                 dy++;
  261. !                 if (++ya >= cnp->cn_zoom) {
  262. !                     ya = 0;
  263. !                     sy++;
  264. !                 }
  265.               }
  266.           }
  267.   
  268. -------------------------------------------------------------------------------
  269.  
  270. I would like to make several remarks on the above modifications:
  271.  
  272. (i) In contrast to IBIT32 for the RGB value represented in 32 bit,
  273. a new type IBIT 16 is introduced for the RGB value represented in 16 bit as:
  274.  
  275.     typedef unsigned short int IBIT16;
  276.  
  277. (ii) In order to confirm that when the true color model is used, the RGB value
  278. is represented in either 16 bit or 32 bit, the following code is added:
  279.  
  280.         if ((xBypp != 2) && (xBypp != 4)) {
  281.           fprintf(stderr, "unsupported bytes per pixel: %d\n",
  282.               xBypp);
  283.           exit(1);
  284.         }
  285.  
  286. (iii) The original code to calculate the shift for the red field in the RGB
  287. value was
  288.  
  289.         redShift = ffs(redMask & ~(redMask >> 1)) - 8;
  290.  
  291. This assumes that the field has 8 bit length. This is changed to
  292.  
  293.         redShift = ffs(redMask) - 1;
  294.  
  295. Same is true for the fields of Green and Blue. This new code may have some
  296. problem on the respect to byte order mismatch between X server and X client.
  297. I am not sure. I did not inspect it.
  298.  
  299. (iv) A new function "sw2()" is added. This is the 16 bit version of sw4().
  300.  
  301. (v) The following code assumes that each pixel is represented by 32 bit
  302. integer:
  303.  
  304.           da = (ximbuf + dy * cnp->cn_xim->bytes_per_line
  305.             + dx * sizeof(IBIT32));
  306.  
  307. In the new code, "sizeof(IBIT32)" is replaced by "xBypp".
  308.  
  309. (vi) When a pixel value is written in memory, the following "if" statement
  310. is introduced to respect the bit length of the pixel:
  311.  
  312.             if (xBypp == 4) {
  313.  
  314.             /* Same as the original code */
  315.  
  316.             }
  317.             else {
  318.               /* xBypp == 2 */
  319.               IBIT16 pixvs;
  320.               pixr = pixr >> 4;
  321.               pixg = pixg >> 4;
  322.               pixb = pixb >> 4;
  323.               pixvs = ((redMask & (pixr << redShift))
  324.                    |(greenMask & (pixg << greenShift))
  325.                    |(blueMask & (pixb << blueShift)));
  326.               if (revByte)
  327.             *((IBIT16*)da) = sw2(pixvs);
  328.               else
  329.             *((IBIT16*)da) = pixvs;
  330.               da += sizeof(IBIT16);
  331.             }
  332.  
  333. We should be careful that the original pixr, pixg, pixb values are
  334. in the range 0-255.
  335.  
  336. Thank you very much.
  337.  
  338. Satoshi Adachi
  339. (adachi@wisdom.ap.titech.ac.jp)
  340.  
  341. Research Associate
  342. Department of Applied Physics
  343. Tokyo Institute of Technology
  344. Meguro, Tokyo 152, JAPAN
  345.